home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / disk / cdrom / MusicBox-2.1bi.lha / MusicBox / Inquiry.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-29  |  7.3 KB  |  313 lines

  1. /*
  2.  ##########################################################################
  3.  ####                                                                  ####
  4.  ####                        The MusicBox Project                      ####
  5.  ####                    ============================                  ####
  6.  ####                                                                  ####
  7.  #### Inquiry.c                                                        ####
  8.  ####                                                                  ####
  9.  #### Version 2.1os  --  September 29, 2000                            ####
  10.  ####                                                                  ####
  11.  #### Copyright (C) 1994  Thomas Dreibholz                             ####
  12.  ####               2000  Molbachweg 7                                 ####
  13.  ####                     51674 Wiehl                                  ####
  14.  ####                     Germany                                      ####
  15.  ####                                                                  ####
  16.  ####                     EMail: Dreibholz@bigfoot.com                 ####
  17.  ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  18.  ####                                                                  ####
  19.  ##########################################################################
  20. */
  21. /***************************************************************************
  22.  *                                                                         *
  23.  *   This program is free software; you can redistribute it and/or modify  *
  24.  *   it under the terms of the GNU General Public License as published by  *
  25.  *   the Free Software Foundation; either version 2 of the License, or     *
  26.  *   (at your option) any later version.                                   *
  27.  *                                                                         *
  28.  ***************************************************************************/
  29.  
  30. /* SCSI-Inquiry Hauptprogramm */
  31.  
  32. #define TITEL  "SCSI Inquiry - Version 2.1os   Copyright (C) 1994-2000 by Thomas Dreibholz"
  33. #define VERSTR "$VER: Inquiry 2.1os (Sep 29 2000) - Copyright (C) 1994-2000 by Thomas Dreibholz"
  34.  
  35. extern struct ExecBase *SysBase;
  36. struct GfxBase         *GfxBase;
  37. struct IntuitionBase   *IntuitionBase;
  38. struct Library         *DiskfontBase;
  39. struct Library         *MusicBoxBase;
  40.  
  41. struct IOStdReq      *io;
  42. struct MsgPort       *port;
  43. struct SCSICmd       *scsi;
  44. struct Device        *found;
  45. struct Window        *win;
  46. struct RastPort      *rp;
  47. struct TextFont      *Font,*TimesFont;
  48.  
  49. UBYTE                *DevName;
  50. UBYTE                *sense;
  51. UBYTE                 str[80],
  52.                       str2[20];
  53. UBYTE                *VerStr=VERSTR;
  54.  
  55. struct DriveInfo
  56. {
  57.  UBYTE PeripheralType;
  58.  UBYTE Modifier;
  59.  UBYTE Version;
  60.  UBYTE Flags1;
  61.  UBYTE AdditionalLength;
  62.  UBYTE reserved[2];
  63.  UBYTE Flags2;
  64.  UBYTE Vendor[8];
  65.  UBYTE Product[16];
  66.  UBYTE Revision[4];
  67. };
  68.  
  69. struct DriveInfo *di;
  70.  
  71. UBYTE *DevNames[]=
  72. {
  73.  "----- <change me> -----",
  74.  "scsi.device",
  75.  "hddisk.device",
  76.  "suprascsi.device",
  77.  "gvpscsi.device",
  78.  "HardFrame.device",
  79.  "IVS_SCSI.device",
  80.  "IVS_SCSIpro.device",
  81.  "icddisk.device",
  82.  "harddisk.device",
  83.  "ADD_scsi.device",
  84.  "Nexus.device",
  85.  "ALF.device",
  86.  0L
  87. };
  88.  
  89. UBYTE cmd_driveinfo[6] = { 0x12, 0x00, 0x00, 0x00, 0x90, 0x00 };
  90.  
  91. struct TextAttr times = {
  92.    ( STRPTR )"times.font", 15, 0x00, 0x42 };
  93.  
  94. struct NewWindow nw=
  95. {
  96.  30,30,580,150,0,1,
  97.  CLOSEWINDOW,
  98.  WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE|GIMMEZEROZERO,
  99.  0L,0L,TITEL,0L,0L,
  100.  100,40,640,256,
  101.  WBENCHSCREEN
  102. };
  103.  
  104.  
  105. void CloseAll()
  106. {
  107.  if(win) CloseWindow(win);
  108.  if(scsi) FreeMem(scsi,sizeof(struct SCSICmd));
  109.  if(di) FreeMem(di,sizeof(struct DriveInfo));
  110.  if(sense) FreeMem(sense,18);
  111.  if(io) DeleteExtIO(io);
  112.  if(port) DeletePort(port);
  113.  if(MusicBoxBase) CloseLibrary(MusicBoxBase);
  114.  CloseLibrary(GfxBase);
  115.  CloseLibrary(IntuitionBase);
  116.  exit(0);
  117. }
  118.  
  119. void OpenAll()
  120. {
  121.  register int i;
  122.  
  123.  GfxBase=OpenLibrary("graphics.library",0L);
  124.  IntuitionBase=OpenLibrary("intuition.library",0L);
  125.  if((GfxBase==NULL)||(IntuitionBase==NULL)) exit(0);
  126.  
  127.  DiskfontBase=OpenLibrary("diskfont.library",0L);
  128.  if(DiskfontBase!=NULL)
  129.    Font=OpenDiskFont(×);
  130.  
  131.  puts("Mus");
  132.  MusicBoxBase=OpenLibrary("musicbox.library",0L);
  133.  puts("OK");
  134.  
  135.  scsi=AllocMem(sizeof(struct SCSICmd),MEMF_CLEAR|MEMF_PUBLIC);
  136.  di=AllocMem(sizeof(struct DriveInfo),MEMF_CLEAR|MEMF_PUBLIC);
  137.  sense=AllocMem(18,MEMF_CLEAR|MEMF_PUBLIC);
  138.  if((scsi==NULL)||(di==NULL)||(sense==NULL))
  139.   {
  140.    puts("Kein Speicher!");
  141.    CloseAll();
  142.   }
  143.  
  144.  port=CreatePort(0L,0L);
  145.  if(port==NULL)
  146.   {
  147.    puts("Kein Speicher für Port!");
  148.    CloseAll();
  149.   }
  150.  
  151.  io=CreateExtIO(port,sizeof(struct IOStdReq));
  152.  if(io==NULL)
  153.   {
  154.    puts("Kein Speicher für IO-Request!");
  155.    CloseAll();
  156.   }
  157.  
  158.  win=OpenWindow(&nw);
  159.  if(win==NULL)
  160.   {
  161.    puts("Kein Speicher für Fenster!");
  162.    CloseAll();
  163.   }
  164.  rp=win->RPort;
  165.  if((Font)&&(win->WScreen->Height>299)) SetFont(rp,Font);
  166.  
  167.  i=0;
  168.  DevName=NULL;
  169.  do
  170.   {
  171.    found=FindName(&SysBase->DeviceList,DevNames[i]);
  172.    if(found!=NULL)
  173.     {
  174.      DevName=DevNames[i];
  175.      break;
  176.     }
  177.    else
  178.      i++;
  179.   } while(DevNames[i]!=NULL);
  180. }
  181.  
  182.  
  183. WORD SCSI(cmd,len,buf,buflen,direction)
  184.  UBYTE *cmd;
  185.  UBYTE *buf;
  186.  LONG   buflen;
  187.  WORD   len,direction;
  188. {
  189.  io->io_Command=HD_SCSICMD;
  190.  io->io_Data=scsi;
  191.  io->io_Length=sizeof(struct SCSICmd);
  192.  
  193.  scsi->scsi_Data=buf;
  194.  scsi->scsi_Length=buflen;
  195.  scsi->scsi_Flags=SCSIF_AUTOSENSE|direction;
  196.  scsi->scsi_SenseData=sense;
  197.  scsi->scsi_SenseLength=18;
  198.  scsi->scsi_SenseActual=0;
  199.  
  200.  scsi->scsi_Command=cmd;
  201.  scsi->scsi_CmdLength=len;
  202.  
  203.  DoIO(io);
  204.  return(scsi->scsi_Status);
  205. }
  206.  
  207. void Out(x,i)
  208.  int x,i;
  209. {
  210.  Move(rp,x,(i*15)+15);
  211.  Text(rp,str,strlen(&str));
  212. }
  213.  
  214. void Inquiry(num)
  215. {
  216.  LONG dev;
  217.  WORD test;
  218.  
  219.  dev=OpenDevice(DevName,num,io,0);
  220.  if(dev==0)
  221.   {
  222.    test=SCSI(&cmd_driveinfo,6,di,sizeof(struct DriveInfo),SCSIF_READ);
  223.    CloseDevice(io);
  224.    if(test!=0)
  225.     {
  226.      sprintf("SCSI-Status = $%x",test);
  227.      Out(70,num);
  228.     }
  229.    else
  230.     {
  231.      switch(di->PeripheralType)
  232.       {
  233.        case 0x00:
  234.          strcpy(&str,"Harddisk");
  235.         break;
  236.        case 0x01:
  237.          strcpy(&str,"Streamer");
  238.         break;
  239.        case 0x05:
  240.          strcpy(&str,"CD-ROM");
  241.         break;
  242.        default:
  243.          sprintf(&str,"Type %d",di->PeripheralType);
  244.         break;
  245.       }
  246.      Out(100,num);
  247.      strncpy(&str2,&di->Vendor,8); str2[8]=0x00;
  248.      sprintf(&str,"%s ",&str2);
  249.      strncpy(&str2,&di->Product,16); str2[16]=0x00;
  250.      strcat(&str,&str2);
  251.      Out(230,num);
  252.      strncpy(&str,&di->Revision,4); str[4]=0x00;
  253.      Out(520,num);
  254.     }
  255.   }
  256.  else
  257.   {
  258.    strcpy(&str,"unused");
  259.    Out(120,num);
  260.   }
  261. }
  262.  
  263. void main(argc,argv)
  264.  int    argc;
  265.  UBYTE *argv[];
  266. {
  267.  register int                  i,j;
  268.  register struct IntuiMessage *msg;
  269.  
  270.  if(argc==2)
  271.   {
  272.    DevNames[0]=argv[1];
  273.   }
  274.  
  275.  OpenAll();
  276.  if(MusicBoxBase) SleepPointer(win);
  277.  
  278.  SetAPen(rp,2);
  279.  for(i=0;i<7;i++)
  280.   {
  281.    sprintf(&str,"Unit #%d: ",i);
  282.    Out(10,i);
  283.   }
  284.  
  285.  if(DevName==NULL)
  286.   {
  287.    strcpy(&str,"?");
  288.    for(i=0;i<7;i++)
  289.      Out(120,i);
  290.    sprintf(&str,"Device = ???   Unknown controller",DevName);
  291.    Out(30,7);
  292.   }
  293.  else
  294.   {
  295.    sprintf(&str,"Device = %s",DevName);
  296.    Out(30,7);
  297.    if(!(strcmp(DevName,"scsi.device")))
  298.     {
  299.      strcpy(&str,"Amiga 590/2091 SCSI");
  300.      Out(270,7);
  301.     }
  302.  
  303.    for(i=0;i<7;i++) Inquiry(i);
  304.   }
  305.  ClearPointer(win);
  306.  
  307.  WaitPort(win->UserPort);
  308.  ReplyMsg(GetMsg(win->UserPort));
  309.  
  310.  CloseAll();
  311. }
  312.  
  313.